"""超声波测距"""

import pyb
from pyb import *
import time
import pyb
from pyb import Pin
from pyb import Timer
from machine import SPI, Pin
import Servo9527
import os

# 超声波测距离
class Trig_Echo9527():
    def __init__(self):
        self.Trig = Pin('Y7', Pin.OUT_PP)   # 超声波启动信号
        self.Echo = Pin('Y8', Pin.IN)       # 超声波信号接收
        self.num = 0                        # 计时
        self.flag = 0                       # 状态
        self.run = 1                        # 是否运行

    # 内存返还
    def __del__(self):
        self.flag = 0
        self.run = 0
        self.num = 1
        self.Trig.value(0)
        self.Echo.value(0)

    # 超声波试运行 方法测试
    def Trig_Echo(self):
        Trig = Pin('Y7', Pin.OUT_PP)
        Echo = Pin('Y8', Pin.IN)
        Trig.value(1)
        pyb.udelay(100)
        Trig.value(0)
        try:
            count = 0
            while (Echo.value() == 0):
                Trig.value(1)
                pyb.udelay(100)
                Trig.value(0)
            print("Echo: 检查到目标>> : ", Echo.value())
            if (Echo.value() == 1):
                print("Echo: 确认目标>> : ", Echo.value())
                print("Echo: 开始计算目标>> : ", Echo.value())
                while (Echo.value() == 1):
                    count += 1
            print("Echo: 目标计算完成: ", Echo.value())
            print("目标返回数据 count:     ", count)
            print("超声波测试完成! ")
        except:
            Trig.value(0)
            Echo.value(0)
            print("程序报错退出")

    # 开始计时
    def start(self, t):
        if (self.flag == 0):
            self.num = 0
        else:
            self.num = self.num + 1
    # 工作状态
    def stop(self, t):
        if (self.run == 0):
            self.run = 1

    # 超声波模块开始运行
    def Echo_run(self):
        try:
            # 回掉函数, 中断
            start1 = Timer(1, freq=10000, callback=self.start)
            stop1 = Timer(4, freq=2, callback=self.stop)

            if (self.run == 1):
                # 拉高电平 超声波开始工作
                self.Trig.value(1)
                pyb.udelay(100)         # 超声波测试最好用这个定时器
                self.Trig.value(0)     # 拉低电平
                # 超声波信号处理  没有铺抓到反射信号 返回 0 有信号返回1
                while (self.Echo.value() == 0):
                    # 没有接受到反射信号,  超声波继续拉高电平工作 直到检查到信号退出循环
                    self.Trig.value(1)   # 拉高
                    pyb.udelay(100)
                    self.Trig.value(0)   # 拉低
                    self.flag = 0
                if (self.Echo.value() == 1):
                    self.flag = 1
                    while (self.Echo.value() == 1):
                        self.flag = 1
                if (self.num != 0):
                    print('超声波扫描用是: num:', self.num)
                    # 超声波计算公式  扫描用时 / 10000 * 34299 / 2
                    distance = self.num / 10000 * 34299 / 2
                    print('智能车距离障碍:')
                    print(distance, 'cm')
                self.flag = 0
                self.run = 0
                self.Trig.value(0)
                self.Echo.value(0)
        except:
            self.flag = 0
            self.run = 0
            self.Trig.value(0)
            self.Echo.value(0)
            print("退出程序!!")
